#define EXPAND(...) EXPAND4(EXPAND4(EXPAND4(EXPAND4(__VA_ARGS__))))
#define EXPAND4(...) EXPAND3(EXPAND3(EXPAND3(EXPAND3(__VA_ARGS__))))
#define EXPAND3(...) EXPAND2(EXPAND2(EXPAND2(EXPAND2(__VA_ARGS__))))
#define EXPAND2(...) EXPAND1(EXPAND1(EXPAND1(EXPAND1(__VA_ARGS__))))
#define EXPAND1(...) __VA_ARGS__

#define PARENS(n) (n)

#define REPEAT_DECL_1(macro, a1, ...) macro(a1) __VA_OPT__(REPEAT_HELPER PARENS(1)(macro, __VA_ARGS__))
#define REPEAT_DECL_2(macro, a1, a2, ...) macro(a1, a2) __VA_OPT__(REPEAT_HELPER PARENS(2)(macro, __VA_ARGS__))
#define REPEAT_DECL_3(macro, a1, a2, a3, ...) macro(a1, a2, a3) __VA_OPT__(REPEAT_HELPER PARENS(3)(macro, __VA_ARGS__))
#define REPEAT_DECL_4(macro, a1, a2, a3, a4, ...) macro(a1, a2, a3, a4) __VA_OPT__(REPEAT_HELPER PARENS(4)(macro, __VA_ARGS__))
#define REPEAT_HELPER(n) REPEAT_DECL_##n

#define FOR_EACH(macro, num, ...) __VA_OPT__(EXPAND(REPEAT_DECL_##num(macro, __VA_ARGS__)))

#define REPEAT_DECL_ARG_1(macro, arg, a1, ...) macro(arg, a1) __VA_OPT__(REPEAT_HELPER_ARG PARENS(1)(macro, arg, __VA_ARGS__))
#define REPEAT_DECL_ARG_2(macro, arg, a1, a2, ...) macro(arg, a1, a2) __VA_OPT__(REPEAT_HELPER_ARG PARENS(2)(macro, arg, __VA_ARGS__))
#define REPEAT_DECL_ARG_3(macro, arg, a1, a2, a3, ...) macro(arg, a1, a2, a3) __VA_OPT__(REPEAT_HELPER_ARG PARENS(3)(macro, arg, __VA_ARGS__))
#define REPEAT_DECL_ARG_4(macro, arg, a1, a2, a3, a4, ...) macro(arg, a1, a2, a3, a4) __VA_OPT__(REPEAT_HELPER_ARG PARENS(4)(macro, arg, __VA_ARGS__))
#define REPEAT_HELPER_ARG(n) REPEAT_DECL_ARG_##n

#define FOR_EACH_ARG(macro, num, arg, ...) __VA_OPT__(EXPAND(REPEAT_DECL_ARG_##num(macro, arg, __VA_ARGS__)))
